package com.itheima;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.junit.jupiter.api.Test;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
 * @author :速趴赛亚锦   -======================【jwt令牌测试】======================
 * @date :2024/3/18 13:50
 */
public class JWTlingpai {
    // 0:导入依赖
    //  1: 生成令牌 -- jwt提供的功能
    //  2：校验令牌 -- jwt提供的功能
    @Test
    void genJwt() {
        // jwt 三部分  头(算法和类型)  负载(身体)  签名(算法+秘钥+头+负载)
        // 负载就是要存储的数据 一般是 json--map格式
        Map<String,Object> data = new HashMap<>();
        data.put("id",1);
        data.put("username","Tom");

        // 支持写 过期时间！！
        String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, "itheima")//签名算法
                .setClaims(data)// 带的数据                           1000毫秒*60*60*24 ：代表是一天的有效期
                .setExpiration(new Date(System.currentTimeMillis() + 2000))//一天有效期
                .compact();//签订契约 产生一个jwt的串

        System.out.println(jwt);
        //eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwiZXhwIjoxNjgxNDU5ODc3LCJ1c2VybmFtZSI6IlRvbSJ9.eQQ5DRIQdj1OucSJtaAABZf4x-dubPU91YxPDsSjWjc
    }

    @Test
    public void parseJwt(){

        //eyJpZCI6MSwiZXhwIjoxNjgxNDU5ODc3LCJ1c2VybmFtZSI6IlRvbSJ9
        //解析令牌       {"id":1,"exp":1681459877,"username":"Tom"}  去base64可以解码
        String jwt = "eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwiZXhwIjoxNjgxNDU5ODc3LCJ1c2VybmFtZSI6IlRvbSJ9.eQQ5DRIQdj1OucSJtaAABZf4x-dubPU91YxPDsSjWjc";
        //【jwt令牌分为三个片段】 中间这段是：jwt 三部分  头(算法和类型)  负载(身体)  签名(算法+秘钥+头+负载)
        Claims itheima = Jwts.parser().setSigningKey("itheima").parseClaimsJws(jwt).getBody();

        System.out.println(itheima);// 既做了验证 又做了解析  {id=1, exp=1681459877, username=Tom}

        // 数字签名的作用是防止篡改。

    }

    @Test
    public void parseJwt2(){
        //解析令牌
        String jwt = "eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwiZXhwIjoxNjgxMzc0MTU3LCJ1c2VybmFtZSI6IlRvbSJ9.tVxzpfcsZ5BF9WplS68YPv2G3j4mnAPoRynl_5SyrnM";
        //
        Claims itheima = Jwts.parser().setSigningKey("itheima").parseClaimsJws(jwt).getBody();

        System.out.println(itheima);// 既做了验证 又做了解析  {id=1, exp=1681459877, username=Tom}

        // 数字签名的作用是防止篡改。

    }
}
